package com.ruoyi.common.utils.sign;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * RSA加密解密
 *
 * @author ruoyi
 **/
public class RsaUtils {
    /**
     * 私钥
     */
    public static String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDbjr5dE4B17Qi7\n" +
            "F0ycbLOeUHrVnx9y8xqumApXPwHXoPMQ1giGm9X0lO9WyIObJlbx2N/xZMNW575k\n" +
            "d2jUiRMXl939NAEqao1inb3rcH1z3wBGAwkDoE2cvH4e8HzTIsVB/lEN51BjJNnR\n" +
            "eIsFS2OXIY/L2kSD1520512ZR07WytIcuyG8FWgurB5A8Ubyki7BPWz/Z3Opjo4l\n" +
            "XhWVDaonuH/hNZqUaSB/cTea7N4hwwUcZ0+L+LAlo+UxQOwCuEjV4Z+2xYHXvaGX\n" +
            "sBOjFhjaV+vPvLOcsS7Vxxgw7FYRdRXNG8n0N3s8YCFd+j2+MWm9N3D3aUxyyz2y\n" +
            "1n+PNiifAgMBAAECggEBAMBZCs8yEZ2+fqKho916odW1fhd+YyfqcNq6mnya13tY\n" +
            "Jvn9+NQs3EF85T1rR1j6OruAG5k4hKWzOyp7LlzchdxqkPGNyOOnG5xkw4jrMQz9\n" +
            "Nhkf+ZqyqqwAuqFSYJj8YkIRkmMS3mstUqJf77NAu8wgfADEhLfYgvKEq4xoW1py\n" +
            "EDCGdiBwvYOMGRsvzhtQ/M2WuzPKzQ/dE9tDtMTiyq6HUAzpKhQlzeWQtMQFd8zb\n" +
            "XOEQbj82ihZDFmpbCFvTeeavaQFptmudujeGIScpDHlaxAHCVn7j1DOoOsafuvI3\n" +
            "0ZNynMae1u/3M6lNqZHEj99lRFg+idDy1aOe9xQNW0ECgYEA8S6pnWXJAn9zwtjh\n" +
            "IUeZPynqAoBd69+qDgVwy0lUFbsoPy0/RQkzF4yGCpFSljOBJ56JgUs7CJzQbLyQ\n" +
            "GljdRTp8lBieSFpEebNcQ3u4qSg3O10frj5uDDvlHq8j9eiMWrX2NYMmzsuP2Wq+\n" +
            "iopN6SU9Lww0vSntRpRG74H2rqECgYEA6Qv3S+cnxw7ienOclogz2VpJlLWhXYsY\n" +
            "PuZ+2dWNQK69ka14JY1+lnkRHBBv2QNUJJJG+2rVIOTfPRgkf5wGcZTsdHrVByme\n" +
            "/mAOfDY2NtTVai4AFtGdDyLs5rEOhvypT22J+zg42DaXJeoD90yrf1PbHl8H+w9K\n" +
            "5jSLVSotzz8CgYBpGJpUuhvjeMJq77L6m4aN3afZOzKyLB6gSYKjMurvJUUecosV\n" +
            "fDLFWji2tii0xvDK4OyuaKfq0tqH54srz/lrx1at+iRPBva7yYq05V7MZ3fZ6HR7\n" +
            "qzytHBR1UIBtEc7HYG9PVj0887tVVIx/NlFI/S8yJzF8FJ8OmGJoz8s8wQKBgQDe\n" +
            "W4d6ibTfbmlTkunui0iFc2tPk7nCqkvZAE46hFMBS3ke/Vfs5MPKyPs1Ps2pT07C\n" +
            "kjtd+kIe36HNBjMU+wb+6qxuOyD1c5X7eiV4CLXTvWFfrUJyg1ALODS3rGqDC6J0\n" +
            "YbzM0YkTa4ruJwnftOzRUW553QydVKsPWUU0XklVOwKBgAdSjyiwXLjLPVFRd+q3\n" +
            "WntyiWJwlVHrWV7TCo6An31iOUEzze4zaHKo6AudAtFIlc0F2Ixno3Khs7kUVwxj\n" +
            "RpzZc3F6qdvslSpA2sbVjtUXwz/nCuvngieImqAVF/Wwc6X/sDyBWOjb7tDBjUD6\n" +
            "N7ktvOAcZaWry932w8n50ATV";


    public static String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA246+XROAde0IuxdMnGyz\n" +
            "nlB61Z8fcvMarpgKVz8B16DzENYIhpvV9JTvVsiDmyZW8djf8WTDVue+ZHdo1IkT\n" +
            "F5fd/TQBKmqNYp2963B9c98ARgMJA6BNnLx+HvB80yLFQf5RDedQYyTZ0XiLBUtj\n" +
            "lyGPy9pEg9edtOddmUdO1srSHLshvBVoLqweQPFG8pIuwT1s/2dzqY6OJV4VlQ2q\n" +
            "J7h/4TWalGkgf3E3muzeIcMFHGdPi/iwJaPlMUDsArhI1eGftsWB172hl7AToxYY\n" +
            "2lfrz7yznLEu1ccYMOxWEXUVzRvJ9Dd7PGAhXfo9vjFpvTdw92lMcss9stZ/jzYo\n" +
            "nwIDAQAB";

    /**
     * 私钥解密
     *
     * @param text 待解密的文本
     * @return 解密后的文本
     */
    public static String decryptByPrivateKey(String text) throws Exception {
        return decryptByPrivateKey(privateKey, text);
    }

    /**
     * 公钥解密
     *
     * @param publicKeyString 公钥
     * @param text            待解密的信息
     * @return 解密后的文本
     */
    public static String decryptByPublicKey(String publicKeyString, String text) throws Exception {
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }

    public static String decryptByPublicKey(String text) throws Exception {
        return decryptByPublicKey(publicKey, text);
    }

    /**
     * 私钥加密
     *
     * @param privateKeyString 私钥
     * @param text             待加密的信息
     * @return 加密后的文本
     */
    public static String encryptByPrivateKey(String privateKeyString, String text) throws Exception {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }


    public static String encryptByPrivateKey(String text) throws Exception {
        return encryptByPrivateKey(privateKey, text);
    }

    /**
     * 私钥解密
     *
     * @param privateKeyString 私钥
     * @param text             待解密的文本
     * @return 解密后的文本
     */
    public static String decryptByPrivateKey(String privateKeyString, String text) throws Exception {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }

    /**
     * 公钥加密
     *
     * @param publicKeyString 公钥
     * @param text            待加密的文本
     * @return 加密后的文本
     */
    public static String encryptByPublicKey(String publicKeyString, String text) throws Exception {
        X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }

    /**
     * 构建RSA密钥对
     *
     * @return 生成后的公私钥信息
     */
    public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
        String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
        String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
        return new RsaKeyPair(publicKeyString, privateKeyString);
    }

    /**
     * RSA密钥对对象
     */
    public static class RsaKeyPair {
        private final String publicKey;
        private final String privateKey;

        public RsaKeyPair(String publicKey, String privateKey) {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }

        public String getPublicKey() {
            return publicKey;
        }

        public String getPrivateKey() {
            return privateKey;
        }
    }
}
